import 'dart:async';
import 'dart:developer';
import 'package:appsflyer_sdk/appsflyer_sdk.dart';
import 'package:get/get.dart';
import 'package:yyshort/common/services/storage.dart';
import 'package:yyshort/common/utils/appsflyer_set_DMA_compliance.dart';
import 'package:yyshort/common/values/storage.dart';

class AppsflyerAscribe extends GetxController {
  static AppsflyerAscribe get to => Get.find();

  bool _isSdkStarted = false; // SDK启动状态标记

  late AppsflyerSdk _appsflyerSdk;

  // ---------------- 初始化 ---------------- //
  Future<void> initialize() async {
    // appsFlyer 配置
    final AppsFlyerOptions appsFlyerOptions = AppsFlyerOptions(
      afDevKey: 'Sp6LnNyiwoS35tAdGb44AD', // AppsFlyer开发者密钥
      appId: "6749257215", // 应用ID（iOS）
      timeToWaitForATTUserAuthorization: 50,
      showDebug: true, //  TODO：发布时需要设置为false
      manualStart: true, // 手动启动SDK
    );
    _appsflyerSdk = AppsflyerSdk(appsFlyerOptions);
    _appsflyerSdk
      ..onInstallConversionData(_onConversion) // 注册安装事件回调
      ..onDeepLinking(_onDeepLinking); // 注册深度链接回调
    // OnAppOpen和OnDeepLink互斥，不能同时注册
    await _appsflyerSdk
        .initSdk(
          registerConversionDataCallback: true,
          registerOnAppOpenAttributionCallback: false,
          registerOnDeepLinkingCallback: true,
        )
        .then((value) async {
          log("AppsFlyer SDK 初始化成功:$value", name: 'Appsflyer Initialize');

          await setDmaConsentData();
        });

    // 设置会话之间的最短时间间隔
    _appsflyerSdk.setMinTimeBetweenSessions(3);
    // 可以对特定用户标识符进行匿名化处理,这符合最新的隐私要求（GDPR、COPPA）以及 Facebook 的数据和隐私政策。用于匿名化应用用户
    _appsflyerSdk.anonymizeUser(true);

    log("AppsFlyer 基础配置初始化完成，等待同意授权后启动", name: 'Appsflyer SDK');
  }

  Future<void> setDmaConsentData() async {
    var userCountryCode = StorageService.to.getString(STORAGE_COUNTRY_CODE);
    log(
      "AppsFlyer DmaComplianceManager 获取到的用户国家代码：$userCountryCode",
      name: 'Appsflyer DmaComplianceManager',
    );
    // 初始化DMA管理器与
    final dmaManager = DmaComplianceManager();
    // 判断用户是否受DMA约束
    bool isDmaUser = dmaManager.checkDmaApplicability(userCountryCode);
    if (isDmaUser) {
      log("AppsFlyer SDK 初始化，用户受DMA约束", name: 'Appsflyer DmaComplianceManager');
      // 设置DMA同意数据
      await dmaManager.setDmaConsentData(
        appsflyerSdk: _appsflyerSdk,
        allowCrossAppTracking: true,
        allowPersonalizedAds: true,
      );
      await to.authorizeWithTcfV22Cmp();
    } else {
      log(
        "AppsFlyer SDK 初始化，用户不受DMA约束",
        name: 'Appsflyer DmaComplianceManager',
      );
      await to.authorizeForGdprUser(
        hasConsentForDataUsage: true,
        hasConsentForAdsPersonalization: true,
        hasConsentForAdStorage: true,
      );
    }
  }

  // ---------------- 授权场景 ---------------- //

  /// 场景1：使用 TCF v2.2 兼容的 CMP（推荐，自动获取同意数据）
  /// 调用时机：用户在CMP界面完成授权后
  Future<void> authorizeWithTcfV22Cmp() async {
    // 1. 启用TCF数据自动收集（CMP会自动传递同意数据）
    _appsflyerSdk.enableTCFDataCollection(true);
    await _startSdk("TCF v2.2 CMP 授权");
  }

  /// 场景2：手动收集同意数据 - GDPR 适用用户
  /// 调用时机：用户明确同意GDPR相关授权后
  /// [hasConsentForDataUsage]：是否同意数据用于广告目的
  /// [hasConsentForAdsPersonalization]：是否同意数据用于个性化广告
  /// [hasConsentForAdStorage]：是否同意存储广告相关数据（新增参数）
  Future<void> authorizeForGdprUser({
    required bool hasConsentForDataUsage,
    required bool hasConsentForAdsPersonalization,
    bool? hasConsentForAdStorage,
  }) async {
    _appsflyerSdk.setConsentDataV2(
      isUserSubjectToGDPR: true, // 标记为GDPR适用用户
      consentForDataUsage: hasConsentForDataUsage,
      consentForAdsPersonalization: hasConsentForAdsPersonalization,
      hasConsentForAdStorage: hasConsentForAdStorage, // 新增：广告存储同意
    );
    _appsflyerSdk.enableTCFDataCollection(false); // 手动收集时禁用自动收集

    await _startSdk("GDPR用户手动授权");
  }

  /// 场景3：手动收集同意数据 - GDPR 不适用用户
  /// 调用时机：确认用户不受GDPR约束时（如非欧盟地区用户）
  Future<void> authorizeForNonGdprUser() async {
    // 使用setConsentDataV2标记为非GDPR用户
    _appsflyerSdk.setConsentDataV2(
      isUserSubjectToGDPR: false, // 标记为非GDPR适用用户
      consentForDataUsage: null, // 非GDPR用户无需设置具体同意项
      consentForAdsPersonalization: null,
      hasConsentForAdStorage: null,
    );
    _appsflyerSdk.enableTCFDataCollection(false); // 手动收集时禁用自动收集

    await _startSdk("非GDPR用户授权");
  }

  // ---------------- SDK 启动 ---------------- //
  /// 内部方法：统一启动SDK逻辑
  Future<void> _startSdk(String authType) async {
    // 延迟确保同意数据生效（避免时序问题）
    await Future.delayed(Duration(milliseconds: 500));
    try {
      _appsflyerSdk.startSDK(
        onSuccess: () {
          log("AppsFlyer SDK 启动成功（授权方式：$authType）", name: 'Appsflyer SDK');
          _isSdkStarted = true;
        },
        onError: (int errorCode, String errorMessage) {
          log(
            "AppsFlyer SDK 启动失败（$authType）：$errorCode - $errorMessage",
            name: 'Appsflyer SDK',
          );
        },
      );
    } catch (e, st) {
      log("⚠️ AppsFlyer SDK 启动异常：$e\n$st", name: 'Appsflyer SDK');
    }
  }

  // 发送事件
  Future<bool?> logEvent(String eventName, Map? eventValues) async {
    try {
      final result = await _appsflyerSdk.logEvent(eventName, eventValues);
      log("AppsFlyer SDK 事件[$eventName]-发送结果：$result", name: 'Appsflyer SDK');
      return result;
    } on Exception catch (e) {
      log("AppsFlyer SDK 发送事件[$eventName]异常：$e", name: 'Appsflyer SDK');
      return null;
    }
  }

  // ---------------- 数据采集回调 ---------------- //
  /// 单独处理：安装事件,获取转化数据
  void _onConversion(dynamic data) {
    final map = Map<String, dynamic>.from(data);
    log("获取安装事件数据：$map", name: 'Appsflyer SDK');
  }

  // 直接深度链接
  // void _onOpenAppAttr(Map<String, dynamic> data) {
  //   log("获取打开跟踪数据：$data", name: 'Appsflyer SDK');
  //   onOpenAppAttrData?.call(data);
  // }

  // 统一深度链接
  void _onDeepLinking(DeepLinkResult result) {
    final Map<String, dynamic> data = result.toJson();
    log("获取深度链接数据：$data", name: 'Appsflyer SDK');
  }

  // 应用卸载
  Future<void> onAppUninstall(String token) async {
    if (_isSdkStarted) {
      _appsflyerSdk.updateServerUninstallToken(token);
    }
  }
}
